#ifndef __BASIC_SHM_H__
#define __BASIC_SHM_H__

#include <basic/thrd.h>

__BEGIN_DECLS

#define SHM_AREA_MAX_SIZE   MB(100) /* 共享区域容量 */

/*
 * 创建共享区域
 */
enum
{
    SHM_AREA_LOCK = 0x00000001
};
extern int  /* 0:成功 -1:参数错误
               -2:映射文件删除出错 -3:映射文件打开出错 -4:映射出错
               -5:创建信号量出错而信号量未存在 -6:共享信号量出错
               -7:初始化信号量出错 */
shm_area_create(
        char *area_file,        /* [IN] 区域文件 */
        int area_size,          /* [IN] 区域大小 */
        unsigned int flag       /* [IN] 标志，SHM_AREA_LOCK | ...*/
        );

/*
 * 删除共享区域
 */
extern int  /* 0:成功 -1:参数错误 -2:映射文件删除出错 */
shm_area_destroy(
        char *area_file         /* [IN] 区域文件 */
        );

/*
 * 挂接共享区域
 */
extern void *   /* 共享区域 NULL:出错 */
shm_area_attach(
        char *area_file         /* [IN] 区域文件 */
        );

/*
 * 脱卸共享区域
 */
extern int  /* 0:成功 -1:参数错误 */
shm_area_detach(
        void *area              /* [IN] 共享区域 */
        );

/*
 * 进入共享区域
 */
extern int  /* 0:成功 -1:参数错误 */
shm_area_enter(
        void *area              /* [IN] 共享区域 */
        );

/*
 * 离开共享区域
 */
extern int  /* 0:成功 -1:参数错误 */
shm_area_leave(
        void *area              /* [IN] 共享区域 */
        );

//#define SHM_MSG_SIZE            MB(1)   /* 共享区域消息大小 */
//typedef int SHM_HANDLE;
//
///*
// * 共享内存环境初始化
// */
//extern int  /* 0:成功 -1:初始化句柄失败 */
//shm_startup(
//        int handle_num          /* [IN] 句柄数量 <=0:以缺省值代替 */
//        );
//
///*
// * 共享内存环境清理
// */
//extern int  /* 0:成功 */
//shm_cleanup();
//
///*
// * 客户端申请共享内存句柄
// */
//extern SHM_HANDLE		/* >=0:成功 -1:句柄已分配完
//                            -2:映射文件打开出错 -3:映射出错 */
//shm_clt_apply(
//        char *shm_file  		/* [IN] 共享内存映射文件 */
//        );
//
///*
// * 服务端申请共享内存句柄
// */
//extern SHM_HANDLE		/* >=0:成功 -1:句柄已分配完
//                            -2:映射文件删除出错 -3:映射文件打开出错
//                            -4:映射出错 -5:创建信号量出错而信号量未存在
//                            -6:共享信号量出错 -7:初始化信号量出错 */
//shm_svr_apply(
//        char *shm_file,	    	/* [IN] 共享内存映射文件 */
//        key_t shm_key	    	/* [IN] 共享内存键值
//                                   对Solaris平台无效 */
//        );
//
///*
// * 释放共享内存句柄
// */
//extern int	/* 0:成功 -1:无效句柄或未使用 */
//shm_release(
//        SHM_HANDLE shm_handle   /* [IN] 共享内存句柄 */
//        );
//
///*
// * 客户端请求并获得应答
// */
//extern int		/* 0:成功 -1:无效句柄或未使用 -2:参数错误
//                    -3:等待空闲出错 -4:等待应答出错
//                    -5:应答消息长度错误 */
//shm_clt_call(
//        SHM_HANDLE shm_handle,	/* [IN] 共享内存句柄 */
//        BYTE *send,			    /* [IN] 发送消息缓冲区 */
//        int send_size,		    /* [IN] 发送消息大小 */
//        BYTE *recv,			    /* [OUT] 接收消息缓冲区
//                                   可与send共用 */
//        int *recv_size		    /* [OUT] 接收消息大小
//                                   可与send_size共用 */
//        );
//
///*
// * 服务端接收请求
// */
//extern int		/* 0:成功 -1:无效句柄或未使用 -2:参数错误
//                    -3:等待占用出错 */
//shm_svr_recv(
//        SHM_HANDLE shm_handle,	/* [IN] 共享内存句柄 */
//        BYTE *recv, 			/* [OUT] 接收消息缓冲区 */
//        int *recv_size  		/* [OUT] 接收消息大小 */
//        );
//
///*
// * 服务端返回应答
// */
//extern int		/* 0:成功 -1:无效句柄或未使用 -2:参数错误 */
//shm_svr_resp(
//        SHM_HANDLE shm_handle,	/* [IN] 共享内存句柄 */
//        BYTE *resp,			    /* [IN] 应答消息缓冲区 */
//        int resp_size		    /* [IN] 应答消息大小 */
//        );

__END_DECLS

#endif
